/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package suministros.ejb30.DAO;

import java.util.Date;
import java.util.List;
import java.util.Vector;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.sql.DataSource;
import suministros.ejb30.TO.DepartamentoTO;
import suministros.ejb30.TO.DistritoTO;
import suministros.ejb30.TO.PaisTO;
import suministros.ejb30.TO.ProveedorSuministroTO;
import suministros.ejb30.TO.ProveedorTO;
import suministros.ejb30.TO.ProvinciaTO;
import suministros.ejb30.entity.Departamento;
import suministros.ejb30.entity.Direccionnopersona;
import suministros.ejb30.entity.Proveedor;
import suministros.ejb30.entity.ProveedorSuministro;
import suministros.ejb30.helper.EmailVacioException;
import suministros.ejb30.helper.Utiles_Convertir;


/**
 *
 * @author Arturo
 */
@Stateless
public class SumiGestionProveedor implements SumiGestionProveedorLocal {
    
  @PersistenceUnit(unitName="suministros-pu")
  EntityManagerFactory emf;

  EntityManager em;

  @Resource(name="jdbc/Administracion")
  DataSource dsAdministracion;

  @PostConstruct
  public void inicializaBean()
  {
    this.em = this.emf.createEntityManager();
  }

  @PreDestroy
  public void finalizaBean() {
    this.em.close();
  }
  public Proveedor obtenerDireccion(String codigo){
    Proveedor ped= this.em.find(Proveedor.class, codigo);
    return ped;
}

  public boolean insertarProveedor(Proveedor pro, Direccionnopersona dir) throws Exception
  {
    boolean retorno = false;
    EntityTransaction tx = this.em.getTransaction();
    pro.setIdDireccion(dir);
    tx.begin();
    try {
        this.em.persist(dir);
        pro.setIsAlta(true);
        pro.setFechaOperacion(new Date());
        this.em.persist(pro);
       tx.commit();
       retorno = true;
    } catch (Exception e) {
     tx.rollback();
      throw e;
   }
    return retorno;
  }
  public boolean modificarProveedor(Proveedor pro, Direccionnopersona dir) throws Exception
  {
    boolean retorno = false;
    Proveedor proOr=obtenerDireccion(pro.getCodProveedor());
    Direccionnopersona direc= proOr.getIdDireccion();
    if(!(dir.getCodDistritoDir()==null)){
        dir.setIdDireccion(proOr.getIdDireccion().getIdDireccion());
    }
    else{
        dir=direc;
    }
    EntityTransaction tx = this.em.getTransaction();
    pro.setIdDireccion(dir);
    tx.begin();
    try {
        this.em.merge(dir);
        this.em.merge(pro);
       tx.commit();
       retorno = true;
    } catch (Exception e) {
     tx.rollback();
      throw e;
   }
    return retorno;
  }

  public boolean eliminaProveedor(String cod) throws Exception
  {
    boolean retorno = false;
    EntityTransaction tx = this.em.getTransaction();
    Proveedor pro=obtenerDireccion(cod);
    Direccionnopersona dir =pro.getIdDireccion();
    tx.begin();
    try {    
      pro.setIsAlta(false);
      pro.setFechaBaja(new Date());
      this.em.merge(pro);
      this.em.flush();
      tx.commit();
       retorno = true;
    }
    catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return retorno;
  }
  public List<DepartamentoTO> listaDepartamentos(){
    Query consulta = this.em.createNativeQuery("SELECT Cod_depto, nom_departamento FROM Departamento");
    return Utiles_Convertir.convertirToBeanBinding_Departamento(consulta.getResultList());
  }
   public List<ProvinciaTO> listaProvincia(String codigo){
    Query consulta = this.em.createNativeQuery("SELECT Cod_provincia, nom_Provincia FROM Provincia where Cod_depto='"+codigo+"'");
    return Utiles_Convertir.convertirToBeanBinding_Provincia(consulta.getResultList());
  }
    public List<DistritoTO> listaDistritos(String codigo){
    Query consulta = this.em.createNativeQuery("SELECT Cod_distrito, nom_Distrito FROM Distrito where Cod_provincia='"+codigo+"'");
    return Utiles_Convertir.convertirToBeanBinding_Distrito(consulta.getResultList());
  }
    public List<PaisTO> listaPais(){
     Query consulta = this.em.createNativeQuery("SELECT Cod_pais, nom_pais FROM Pais");
     return Utiles_Convertir.convertirToBeanBinding_Pais(consulta.getResultList());
  }
   public List<ProveedorTO> listaProveedores(){
     Query consulta = this.em.createNativeQuery("SELECT cod_proveedor, razon_social FROM Proveedor order by razon_social asc");
     return Utiles_Convertir.convertirToBeanBinding_Proveedor(consulta.getResultList());
   }
    public List<ProveedorTO> listaCosechador(){
     Query consulta = this.em.createNativeQuery("SELECT cod_proveedor, razon_social FROM Proveedor where cosechador='1'");
     return Utiles_Convertir.convertirToBeanBinding_Proveedor(consulta.getResultList());
   }


     public List<ProveedorSuministroTO> listaProveedorSuministro(){
     Query consulta = this.em.createNativeQuery("select ps.ruc, p.razon_social, s.descripcion, ps.precio from proveedorSuministro ps" +
             " inner join proveedor p on  ps.ruc= p.cod_proveedor inner join suministros s on ps.id_suministro=s.id_suministro" +
             "  order by ps.ruc   ");
     return Utiles_Convertir.convertirToBeanBinding_ProveedorSuministro(consulta.getResultList());
   }

    public ProveedorTO getDatosProveedor(String codigo) throws Exception {
        ProveedorTO proTO=new ProveedorTO();
        Proveedor pro= obtenerDireccion(codigo);
        if(pro.getIdDireccion().getCodDistritoDir()!=null){
             Query consulta = this.em.createNativeQuery("select p.cod_proveedor ,p.razon_social,p.dni_rep_legal, p.rep_legal, p.rnp_bienes,  p.rnp_servicios,p.telefonos, p.fax, p.correo, p.giro_negocio, cosechador, dnp.Cod_pais, dep.nom_departamento, prv.nom_Provincia, d.nom_Distrito, dnp.cod_tipo_via,dnp.nom_via, dnp.cod_tipo_lugar_residencia,dnp.lugar_residencia, dnp.Numero, dnp.refer_dir from proveedor p inner join direccion_no_persona dnp on p.id_direccion= dnp.id_direccion inner join distrito d on d.Cod_distrito= dnp.cod_distrito_dir inner join provincia prv on d.Cod_provincia= prv.Cod_provincia inner join departamento dep on prv.Cod_depto = dep.Cod_depto where p.cod_proveedor='"+codigo+"'");
             proTO= (ProveedorTO)Utiles_Convertir.convertirProveedor(consulta.getResultList()).get(0);
        }
        else{
             Query consulta = this.em.createNativeQuery("select p.cod_proveedor ,p.razon_social,p.dni_rep_legal,  p.rep_legal, p.rnp_bienes,  p.rnp_servicios,p.telefonos, p.fax, p.correo, p.giro_negocio,cosechador, dnp.Cod_pais, dnp.refer_dir from Proveedor p inner join direccion_no_persona dnp on  p.id_direccion= dnp.id_direccion where p.cod_proveedor='"+codigo+"'");
             proTO= (ProveedorTO)Utiles_Convertir.convertirProveedor(consulta.getResultList()).get(0);
        }
        return proTO;
       
  }

    public String verificaEmailProveedor(String ruc) throws EmailVacioException, Exception {
        String email ="";
        Proveedor p   = this.em.find(Proveedor.class, ruc);
         email  = p.getCorreo();
        if(email==null)
            throw new EmailVacioException("Imposible enviar documento al Proveedor: " + p.getRazonSocial().trim() + " - " + p.getCodProveedor() + " ya que no tiene registrado un email");
        return email;
    }
public ProveedorSuministro getDatosProveedorSuministro(ProveedorSuministro sumi) throws Exception {
        ProveedorSuministro proTO=new ProveedorSuministro();
        proTO= this.em.find(ProveedorSuministro.class, sumi.getProveedorSuministroPK() );
        return proTO;

  }
public boolean registrarProveedorSuministro(ProveedorSuministro sumi) throws Exception {

    boolean retorno = false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
      this.em.merge(sumi);
      this.em.flush();
      tx.commit();
       retorno = true;
    }
    catch (Exception e) {
      tx.rollback();
      throw e;
    }
    return retorno;


  }

}
